package offer2

/**
原题链接:
https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/

剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串，计算该最长子字符串的长度。

示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
*/

// 48：最长不含重复字符的子字符串
func lengthOfLongestSubstring(s string) int {

	n := len(s)              //获取字符串长度
	m := make(map[byte]bool) //声明set集合

	ans := 0  //声明结果计数
	left := 0 //声明左右指针
	right := 0

	//只要左右指针都在范围内, 循环遍历  	//滑动窗口
	for left < n && right < n {
		if !m[s[right]] {
			m[s[right]] = true
			right++
			ans = max(ans, right-left)
		} else {
			delete(m, s[left])
			left++
		}
	}

	return ans
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
